package services

import (
	"gitee.com/kun_liu/to-log/app/models"
	"gitee.com/kun_liu/to-log/pkg/database"
	"gorm.io/gorm"
)

// TagService 标签服务
type TagService struct {
	db *gorm.DB
}

// NewTagService 创建标签服务
func NewTagService() *TagService {
	return &TagService{
		db: database.GetDB(),
	}
}

// GetTags 获取标签列表
func (s *TagService) GetTags() ([]models.Tag, error) {
	var tags []models.Tag
	result := s.db.Where("type = ?", "tag").Order("count DESC").Find(&tags)
	return tags, result.Error
}

// GetTagBySlug 根据别名获取标签
func (s *TagService) GetTagBySlug(slug string) (models.Tag, error) {
	var tag models.Tag
	result := s.db.Where("slug = ? AND type = ?", slug, "tag").First(&tag)
	return tag, result.Error
}

// GetTagByID 根据ID获取标签
func (s *TagService) GetTagByID(id uint) (models.Tag, error) {
	var tag models.Tag
	result := s.db.First(&tag, id)
	return tag, result.Error
}

// CreateTag 创建标签
func (s *TagService) CreateTag(tag *models.Tag) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 创建标签
	if err := tx.Create(tag).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}

// UpdateTag 更新标签
func (s *TagService) UpdateTag(tag *models.Tag) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 更新标签
	if err := tx.Save(tag).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}

// DeleteTag 删除标签
func (s *TagService) DeleteTag(id uint) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 获取标签
	var tag models.Tag
	if err := tx.First(&tag, id).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 检查是否有关联的文章
	var postCount int64
	if err := tx.Model(&models.Post{}).Joins("JOIN relationships ON relationships.cid = posts.cid").Where("relationships.mid = ?", id).Count(&postCount).Error; err != nil {
		tx.Rollback()
		return err
	}

	if postCount > 0 {
		tx.Rollback()
		return gorm.ErrForeignKeyViolated
	}

	// 删除标签
	if err := tx.Delete(&tag).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}

// GetHotTags 获取热门标签
func (s *TagService) GetHotTags(limit int) ([]models.Tag, error) {
	var tags []models.Tag
	result := s.db.Where("type = ?", "tag").Order("count DESC").Limit(limit).Find(&tags)
	return tags, result.Error
}

// UpdateTagCount 更新标签文章数量
func (s *TagService) UpdateTagCount(id uint) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 获取标签
	var tag models.Tag
	if err := tx.First(&tag, id).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 计算标签下的文章数量
	var count int64
	if err := tx.Model(&models.Post{}).Joins("JOIN relationships ON relationships.cid = posts.cid").Where("relationships.mid = ? AND posts.type = ?", id, "post").Count(&count).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 更新标签文章数量
	tag.Count = int(count)
	if err := tx.Save(&tag).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}
